package cn.lee.chp2;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

import javax.servlet.Servlet;
import javax.servlet.ServletException;

public class HttpServer {
    
    
    //shutdown command
    public static final String SHUTDOWN_COMMAND = "/SHUTDOWN";
    
    //the shutdown command received
    private boolean shutdown = false;
    
    public static void main(String[] args) {
        HttpServer server = new HttpServer();
        server.await();
    }
    
    public void await() {
        ServerSocket serverSocket = null;
        int port = 8080;
        try {
            serverSocket = new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1"));
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(1);
        }
        
        ServletContainer servletContainer = new ServletContainer();
        try {
            servletContainer.init();
        } catch (ServletException e1) {
            e1.printStackTrace();
        }
        
        //loop waiting for a request
        while(!shutdown){
            Socket socket = null;
            InputStream in = null;
            OutputStream output = null;
            try {
                socket = serverSocket.accept();
                in = socket.getInputStream();
                output = socket.getOutputStream();
                //create request object and parse
                Request request = new Request(in);
                request.parse();
                //create Response object
                Response response = new Response(output);
                response.setRequest(request);
                Servlet servlet = servletContainer.retrieveServlet( request.getUri() );
                
                //if have servelet then use servlet parse, else use static resource
                if(servlet != null){
                    servlet.service(request, response);
                }else{
                    response.sendStaticResource();
                }
                
                //close the socket
                socket.close();
                
                //check if the previous URI is a shutdown command
                shutdown = SHUTDOWN_COMMAND.equals( request.getUri() );
            }catch (Exception e) {
                e.printStackTrace();
                continue;
            }
        }
        //when server shutdown
        servletContainer.destory();
    }
}
